<?php

function print_comments ($category, $idi, $url, $sort = '') 
{
	global $GLOBAL_USER, $SITE, $template, $db;

	// Создаем массив для хранения комментариев
	$comments = array ();

	// Формируем запрос для получения списка комментариев с информацией об авторе	
	$query = $db->query ("SELECT comm.*, usr.user_avatar, usr.user_name , usr.user_id
		FROM ".DB_PEREFIX."_comments AS comm
		LEFT JOIN (
			SELECT user_id, user_name, user_avatar 
			FROM ".DB_PEREFIX."_users) 
				AS usr ON usr.user_id = comm.com_uid
		WHERE com_idi = '$idi' ORDER BY com_id $sort");

	// Если комментарии найдены
	if ($db->num_rows ($query) > 0) 
	{
		// Формируем массив по ключу родительского комментария
		while ($com = $db->fetch_array ($query)) 
		{
			$comments[$com['com_parent']][] = $com;				
		}

		// Запускаем рекурсивный вывод комментариев
		show ($comments[0], $comments, $url, $category, $idi);
	}
}


function show ($arr, $comments, $url, $module, $idi, $level = 0) 
{
	// Ограничение на смещение комментариев
	if ($level >= 300) 
		$level -= 50;

	// Выводи комментарии по глубине
	foreach ($arr as $comm) 
	{
		// Отображаем комментарий
		display_comment ($comm, $level, $url, $module, $idi);
		// Если есть ответ на комментарий то выводим его
		if (isset ($comments[$comm['com_id']])) 
			show ($comments[$comm['com_id']], $comments, $url, $module, $idi, $level+50);
	}
}

// Функция отрисовки комментария
function display_comment ($c, $level, $url, $module, $idi) 
{
	global $SITE, $template, $GLOBAL_USER, $db;
	
	// Если аватар не задан то устанавливаем стандартный
	($c['user_avatar'] != '') 
		? $avatar = '/uploads/avatars/'.$c['user_id'].'.jpg'
		: $avatar = '/images/u_noavatar.gif';	
	// Проверяем голосовал ли пользователь за комментарий
	( in_array($GLOBAL_USER['user_id'], explode (',', $c['com_voters'])) || $c['user_id'] == $GLOBAL_USER['user_id'])
		? $vote = true
		: $vote = false;
	
		// Массив для данных представления
	$data = array (
					'cid'		=> $c['com_id'],
					'uid'		=> $c['user_id'],					
					'name'		=> url_user($c['user_id'], $c['user_name']),
					'date'		=> format_time($c['com_date']),
					'ip'		=> $c['user_ip'],
					'avatar'	=> url_user($c['user_id'],'<img src="'.$avatar.'" title="Аватар для '.$c['user_name'].'" />'),
					'body'		=> replace_symbols(n2br($c['com_text'])),
					'level'		=> $level,
					'idi'		=> $idi,
					'rating'	=> $c['com_rating'],
					'vote'		=> $vote
					);

	// Выводим представление 
	load_module_view('system', 'comment',  $data);
	}

// Функция удаления комментария
function delete_comment ($id) 
{
	global $db;

	// Удаляем комментарий из БД
	$delete = $db->query ("DELETE FROM ".DB_PEREFIX."_comments WHERE com_id = '$id'");
	
	// Выводод сообщения с результатом действия
	if ($delete) 
		site_message ('Комментарий удален!');
	else 
		site_error ('Комментарий не был удален!');
}


function add_comment ($name, $mail, $body, $category, $id, $code) 
{
	global $SITE, $GLOBAL_USER, $db, $template;
	
	// 'table','tr','td','th', - Вынесены до организации удаления парных тэгов
	$allowed_tags = array('a','blockquote','i','em','b','strong',
							'u','ul','ol','li','sup',
							's','strike','font','img','nobr','abbr',
							'acronym','pre','code','br','hr');
	$allowed_string = '';

	foreach ($allowed_tags as $tag) 
		$allowed_string .= '<'.$tag.'>';
	
	// Если комментирование разрещено на сайте
	if ($SITE['allow_comments'] == 'yes') 
	{
		// Если карма больше минимального порога для комментирования
		if (my_karma() > '-10') 
		{

			($GLOBAL_USER['user_id'] != '') 
				? $uid = $GLOBAL_USER['user_id']
				: $uid = '0';
				
			$body =  replace_symbols( xss_clean( strip_tags($body, $allowed_string)));

			$error = '';
			$parent = 0;
			
			if (isset($_POST['parent'])) 
			{
				if (is_registered()) 
				{ 
					$parent = intval($_POST['parent']); 
					$SITE['bot_protect'] = ''; 
				}
				else 
				{ 
					$error .= '<li>Вы не можете отвечать на комментарии!'; 
					$parent = 0; 
				}
			}
			
			if ($body == '') 
				$error .= '<li>Не заполнено поле текста!';

			if (mb_strlen($body) > 1000) 
				$error .= '<li>Текст слишком длинный!';

	
			//  com_category = '$category' AND
			$timer = $db->fetch_array (
				$db->query ("SELECT COUNT(*) 
					FROM ".DB_PEREFIX."_comments 
					WHERE com_idi = '$id' AND com_parent = 0 AND user_ip = '".$_SERVER['REMOTE_ADDR']."' AND com_date > ".(time()-300) ));

			if ($timer[0] > 0) 
				$error .= '<li>Вы не можете оставлять комментарии так часто!';
			
			if ($error == '') 
			{	
				$insertc = "INSERT INTO ".DB_PEREFIX."_comments VALUES (0, '$uid', '$category', '$id', '".strip_tags($name)."', '".strip_tags($mail)."', '$body', '".time()."', '".$_SERVER['REMOTE_ADDR']."', '$parent', 0, '')";

				if ($db->query($insertc)) 
				{
					// Очищаем кэш блока комментариев
					clear_cached('excl_last_comments.php');
					
					// Если отвечаем на комментарий
					if (isset($_POST['parent'])) 
					{
						// Загружаем данные пользователя на комментарий которого отвечаем
						$query = $db->query ("SELECT a.art_header, a.art_id, u.user_id, u.user_name, u.user_email, c.com_text 
							FROM ".DB_PEREFIX."_users AS u
							JOIN ".DB_PEREFIX."_comments AS c ON (u.user_id = c.com_uid)
							JOIN ".DB_PEREFIX."_articles AS a ON (c.com_idi = a.art_id)					
							WHERE com_id ='$parent';");
						$parent = $db->fetch_array($query);
					
						// Если отвечаем не на свой комментарий
						if ($GLOBAL_USER['user_id'] != $parent['user_id'] )
						{
							// Формируем массив данных для представления							
							$data = array (
												'name'		=> $parent['user_name'],
												'newtext'	=> '<i>'.$body.'</i>',
												'oldtext'	=> '<i>'.$parent['com_text'].'</i>',
												'user'		=>	url_user($GLOBAL_USER['user_id'],$GLOBAL_USER['user_name']),
												'topic'		=> anchor('blog/'.$parent['art_id'].'.html','&quot;'.$parent['art_header'].'&quot;'),
												'site'		=> '<a href="http://'.$_SERVER['HTTP_HOST'].'/">'.$SITE['site_name'].'</a>'
											);
							
							//  Выводим представление 	
							$body = load_module_view('system', 'mail/new_comment', $data, true); 

							// Отсылаем оповещение
							send_mail ($parent['user_email'], 'Ответ на ваш комментарий к теме ['.$parent['art_header'].']', n2br($body));
						}
					}
					// Если отвечае на статью
					else
					{
						// Загружаем данные пользователя на статью которого отвечаем
						$query = $db->query ("SELECT a.art_header, a.art_id, u.user_id, u.user_name, u.user_email
							FROM ".DB_PEREFIX."_articles AS a
							JOIN ".DB_PEREFIX."_users AS u ON (a.art_author = u.user_id)					
							WHERE art_id ='$id';");
						$parent = $db->fetch_array($query);
					
						// Если отвечаем не на свой же пост
						if ($GLOBAL_USER['user_id'] != $parent['user_id'] )
						{
							// Формируем массив данных для представления							
							$data = array (
												'name'		=> $parent['user_name'],
												'newtext'	=> '<i>'.$body.'</i>',
												'user'		=>	url_user($GLOBAL_USER['user_id'],$GLOBAL_USER['user_name']),
												'topic'		=> anchor('blog/'.$parent['art_id'].'.html','&quot;'.$parent['art_header'].'&quot;'),
												'site'		=> '<a href="http://'.$_SERVER['HTTP_HOST'].'/">'.$SITE['site_name'].'</a>'
											);
							
							//  Выводим представление 	
							$body = load_module_view('system', 'mail/new_artcomment', $data, true); 
							
							// Отсылаем оповещение
							send_mail ($parent['user_email'], 'Ответ на вашу статью ['.$parent['art_header'].']', n2br($body));
						}
					}
					site_message ('Комментарий добавлен!');
					
				}
				else 
					site_error ('Ошибка добавления комментария!');
			}
			else 
				site_error ($error);

			$SITE['bot_protect'] == 'yes';
		}
		else 
			site_error ('У Вас настолько низкая карма, что вы не можете добавлять комментарии.');
	}
	else 
		site_error ('На сайте нельзя добавлять комментарии!');
}

?>
